{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h1 align=\"center\"> PCA + Logistic Regression (MNIST) </h1>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### NEED TO ADD"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. using PCA for machine learning\n",
    "2. model timing with and without PCA.\n",
    "3. Precision Recall, ROC for performance"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The MNIST database of handwritten digits, available from this page, has a training set of 60,000 examples, and a test set of 10,000 examples. It is a subset of a larger set available from NIST. The digits have been size-normalized and centered in a fixed-size image.\n",
    "<br>\n",
    "It is a good database for people who want to try learning techniques and pattern recognition methods on real-world data while spending minimal efforts on preprocessing and formatting. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Parameters | Number\n",
    "--- | ---\n",
    "Classes | 10\n",
    "Samples per class | ~7000 samples per class\n",
    "Samples total | 70000\n",
    "Dimensionality | 784\n",
    "Features | integers values from 0 to 255"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The MNIST database of handwritten digits is available on the following website: [MNIST Dataset](http://yann.lecun.com/exdb/mnist/)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np \n",
    "# Suppress scientific notation\n",
    "np.set_printoptions(suppress=True)\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.decomposition import PCA\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# Used for Downloading MNIST\n",
    "from sklearn.datasets import fetch_mldata\n",
    "\n",
    "# Used for Splitting Training and Test Sets\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Downloading MNIST Dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Change data_home to wherever to where you want to download your data\n",
    "mnist = fetch_mldata('MNIST original', data_home='~/Desktop/alternativeData')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'COL_NAMES': ['label', 'data'],\n",
       " 'DESCR': 'mldata.org dataset: mnist-original',\n",
       " 'data': array([[0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        ..., \n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0]], dtype=uint8),\n",
       " 'target': array([ 0.,  0.,  0., ...,  9.,  9.,  9.])}"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mnist"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(70000, 784)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# These are the images\n",
    "mnist.data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(70000,)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# These are the labels\n",
    "mnist.target.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Splitting Data into Training and Test Sets"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# test_size: what proportion of original data is used for test set\n",
    "train_img, test_img, train_lbl, test_lbl = train_test_split(\n",
    "    mnist.data, mnist.target, test_size=1/7.0, random_state=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(60000, 784)\n"
     ]
    }
   ],
   "source": [
    "print(train_img.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(60000,)\n"
     ]
    }
   ],
   "source": [
    "print(train_lbl.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10000, 784)\n"
     ]
    }
   ],
   "source": [
    "print(test_img.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10000,)\n"
     ]
    }
   ],
   "source": [
    "print(test_lbl.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Showing Training Digits and Labels"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABIEAAAEKCAYAAACFeUV9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XuUZWV5L+rfxzXQiIIKAUQRL0G3F1C2Ow6J4kEU0GwV\nFYLKVkHwGI1KwvEaonGboaIQiRciOXLzLgJKBI2IuvGuDVFRQQMKAiKIQABBONLf+aNWh6ZZ3+qq\nVavWmt3zecaoUdXzrfXNt9fgR61+a675lVprAAAAAFi3rTfrBgAAAABYeoZAAAAAAD1gCAQAAADQ\nA4ZAAAAAAD1gCAQAAADQA4ZAAAAAAD1gCNRhpZTNSim1lPK5Cay1vJRy8yT6gr6TTegm2YRukk3o\nJtnsJ0OgIQZBWMjHi2fd87qulLKslHLx4Pm+aNb9MBuyOXullAeWUo4opZxaSvn5Ks/1H8+6N2ZH\nNruhlLJtKeU9pZQfl1JuLqX8ppTyvVLKq0spm866P6ZPNrvHa1oS2eyCUsq183jeD5t1n0thg1k3\n0FF/P+TYa5LcM8kxSW5Yrfb9Jerjd0kelmQSE9XnJNl4AuvMytFJtp51E8ycbM7eE5K8NUlNcnGS\nm5LcY6Yd0QWyOWOllD9J8s0kWyb5UpIzk2yaZO8k70ny/FLKn9Vab59dl8yAbHaP17QkstkFR2bu\n5+TqNkjyxiQlyeen2tGUlFrrrHtYK5RSLk3ygCQPrLVeOttu+qWUsk/mXsy+PMmxSX5aa91ptl3R\nFbI5XaWUHZJsl+QHtdabSynLkzw2yTa11l/Psje6RTanq5RyUpL/leTwWutRqxzfKMn/SfKnSZ5T\naz1tRi3SEbI5O17TMopsdkMp5TlJPp3ka7XWJ866n6Xg7WATtPJ9kKWUTUopbxtc6nl7KeV9g/q9\nSymvL6X8n1LKrwa1qwdvq3jskPWGvkezlPLuwfFdSykvKKWcV0q5dXBJ24dLKVu1elvt2DMG6xxe\nSnlcKeXfSik3Dv4OXxrW0+Bx9y+lfGRwvlsG599/1fUW90ze5Vz3TvKhJJ9J8pFJrUu/yObksllr\nvbTW+o1aq/d8s2iyOdGfmzsOPp+x6sHBlT8rf5N53wmchx6QTa9p6SbZnHw2hzh08PmDS3iOmTIE\nmrz1knwuyYsz95u39yS5cFDbJXOX/v0+yWczdznoV5Psk+SbpZSFThpfm+RfkvwsyfuT/EeSFyb5\nt1LK+gtYZ7ck52bu7R3HJflikv8ryVdLKQ9Y9RtLKfdL8q0kL8jcZYnHJPlxkpOSHDxs8VXCOs4N\nxz6YZMMk//cYj4VVyeZqFplNmBTZXM2Y2fzx4PPTV1trwyRPS/KHzD2/MF+yuRqvaekI2VzNpF7T\nlrkr3vdMcl3mrgZaJ7kn0ORtkrn7Yzyi1rr6eznPT/LHtdbrVz1YSnlQku8kOSrJf1/AufZIsnOt\n9WeDdUrmfrvwPzP3gu+sea7zzCTPq7X+13/opZS/SfLuJK/IXPhXOirJtkn+rtb6v1f5/g8k+foC\nel+jUsqBmXtv6V/UWq8upWw2yfXpHdmEbpLNyXhb5l64Hl1K2TtzL5w3TbJXki2SHFhrdRNaFkI2\nJ8RrWiZMNpfOIZm7F9BJtdbblvhcM+NKoKXxhiGBTK31utUDOTh+SeYu3961lLLlAs7zrpWBHKxT\nk/y/gz8+bgHr/NuqgRw4bvV1Sin3SLJvkmuSvGvVb661fjvJKY31v5K5G47N+zcfpZTtk7w3ySm1\n1k/O93GwBrJ5VwvOJiwR2byrBWez1npFkv+R5AtJnpq5F9SvzNzbxD6eud8Ew0LJ5l15TUtXyOZd\nLfo1bSllgyQvWa23dZIh0NL4bqtQSnlyKeW0UsoVg/do1lJKzZ3/wW23gPMsH3Ls8sHnLRazTq31\npiT/udo6j8jc1WPn1Vp/P2SdoZPZWuvvaq0XDV6grtFgwnxiktuS/OV8HgPzJJt3XWtB2YQlJJt3\nXWvB2SylPHSw3gMyd0XQ5pn7Teprkrw0yfdKKdvOdz0YkM27ruU1LV0hm3ddaxKvaf88yTZJzl3X\nr5z1drDJu2XwH/TdlFJemOTkzG3Bd3aSX2RuW76aud/aPT4L21bvbtPfzL3nP0kW8h7NYeusXGvV\nde45+Hx14/tbxxfq5Zl7j+hzaq3XTmhNkE3oJtmcjI8leWiSh9ZaLx4cuynJe0spm2fu7WJvzNzV\nQTAfsrl4XtOyFGRzaay8IfQ6fRVQYgi0FOqI2tsy94Jsl1rrz1ctlFIekrlQdtmNg89bN+qt4wv1\nmMHnU+d+gXI3fzKYZifJhrXWPwz7JliNbEI3yeYilVL+OMljk/xylQHQqr4y+Dx0FxZokM3F85qW\npSCbEza4OfVTk/w26/ANoVcyBJqSwXsMH5C5y8tWD+SG6X4gk+SCzE1rH1tK+aMhl+jtNqHzfK1x\nfIMkL8rcZYMrw7liQuekp2QTukk2F2Tlb3W3LKWsV2td/Wfjyq3hb5/Q+egx2VwQr2mZGtlclJdm\n7lY5J6/LN4ReyT2BpmQw2b8yyX8rpdxn5fFSynpJ3p7kgbPqbb4Glx1+JslWSf6fVWullP+R5HnD\nHldKWVZK2Wmw3d98znNSrfWlq3/kzkvYf73KcT8wWRTZnH82YZpkc0HZ/OXgY7PcdYeVlFKWZe5t\nYElyzvy7h+Fk02taukk2x3tNW+a2uj9o8Md1/q1giSuBpu0fM7cN3g9LKadlbuL/pCQ7JPl8kr1n\n19q8/U3mJrBvLaU8Mcn3ktwvyX5J/jXJs3L332Q8eVA7M8kzptcqzJtszjObpZSNk3xwlUM7DD4f\nU0q5dfD1+2qtw24kCAslm/PIZq21llL+KslpSd5eSnl65m4aulmSp2fuJqA/TvKeSfyFILLpNS1d\nJZsLz+YzMreRwjp/Q+iVXAk0XUdnbtu632Zu2nhAkp9lblu8n8ywr3mrtf4yyZ9mbrvZxyQ5LMl/\ny9wlrZ8dfNuNwx8NnSWb87fhYM2VH/ceHN9vlWM7TOA8kMjmQs5zxuA8n8jcb3tfleTAJNcleWuS\nx9da/XxmUmQTukk2F643N4ReqdQ66r5SMH+llGMy96Jzt1rrN2bdDzBHNqGbZBO6STahm2RzMgyB\nWLBSyra11l+tduy/Jzk3c79xfIDdDWD6ZBO6STahm2QTukk2l5Z7AjGOC0sp52fu/gK/T/InufP9\npa8QSJgZ2YRukk3oJtmEbpLNJeRKIBaslPL2JPskuX/mbjp5fZJvJjmy1vrNWfYGfSab0E2yCd0k\nm9BNsrm0DIEAAAAAesDuYAAAAAA9YAgEAAAA0AOGQAAAAAA9YAgEAAAA0AOGQAAAAAA9YAgEAAAA\n0AOGQAAAAAA9YAgEAAAA0AOGQAAAAAA9YAgEAAAA0AOGQAAAAAA9YAgEAAAA0AOGQAAAAAA9YAgE\nAAAA0AOGQAAAAAA9YAgEAAAA0AOGQAAAAAA9YAgEAAAA0AOGQAAAAAA9YAgEAAAA0AOGQAAAAAA9\nYAgEAAAA0AMbTPNkpZQ6zfNB19Ray6x7GEY26TvZhG6STegm2YRumk82F3UlUCllr1LKT0spF5dS\nXr+YtYDJkU3oJtmEbpJN6CbZhMkrtY43LC2lrJ/kZ0n2THJFku8lOaDW+pMRjzGZpdem8VsT2YSF\nk03oJtmEbpJN6KalvhLocUkurrX+vNZ6e5JPJHnmItYDJkM2oZtkE7pJNqGbZBOWwGKGQNsluXyV\nP18xOHYXpZRDSynLSynLF3EuYP5kE7pJNqGbZBO6STZhCSz5jaFrrcclOS5xeR50iWxCN8kmdJNs\nQjfJJizMYq4EujLJ9qv8+X6DY8BsySZ0k2xCN8kmdJNswhJYzBDoe0keUkp5YClloyR/keSMybQF\nLIJsQjfJJnSTbEI3ySYsgbHfDlZr/UMp5ZVJ/i3J+kmOr7X+eGKdAWORTegm2YRukk3oJtmEpTH2\nFvFjncx7NOm5aWynOQ7ZpO9kE7pJNqGbZBO6aam3iAcAAABgLWEIBAAAANADhkAAAAAAPWAIBAAA\nANADhkAAAAAAPWAIBAAAANADhkAAAAAAPWAIBAAAANADhkAAAAAAPWAIBAAAANADhkAAAAAAPWAI\nBAAAANADhkAAAAAAPWAIBAAAANADhkAAAAAAPWAIBAAAANADhkAAAAAAPWAIBAAAANADG8y6Afrp\n7LPPbtae8pSnNGsHHXRQs3bCCScsqieYrw033LBZO/7445u1M888c+jxT3ziE4vuCZi87bffvln7\n8pe/3Kz967/+a7P213/914vqCQBgMVwJBAAAANADhkAAAAAAPWAIBAAAANADhkAAAAAAPWAIBAAA\nANADdgdjyYzaVeWxj31ss7ZixYpm7eEPf/iieoJJeNazntWsveAFL2jWHvnIRw49fvrppzcfc9tt\nt82/MWCiXvjCFzZrD3rQg5q117zmNc3aN77xjWbt1FNPnV9jwMQdcsghzdo///M/N2tHHnlks/aG\nN7xhUT0BLIVFDYFKKZcmuSnJHUn+UGvddRJNAYsjm9BNsgndJJvQTbIJkzeJK4GeXGu9dgLrAJMl\nm9BNsgndJJvQTbIJE+SeQAAAAAA9sNghUE3ypVLKeaWUQ4d9Qynl0FLK8lLK8kWeC5g/2YRukk3o\nJtmEbpJNmLDFvh1st1rrlaWUrZKcXUq5qNZ67qrfUGs9LslxSVJKqYs8HzA/sgndJJvQTbIJ3SSb\nMGGLuhKo1nrl4PM1SU5P8rhJNAUsjmxCN8kmdJNsQjfJJkze2FcClVKWJVmv1nrT4OunJnnrxDpj\nrbDhhhs2a4cffnizds973nMp2iGy2WWPetSjhh4fteX8Jz/5yaVqhymTzbXPZpttNvE111vP7Ri7\nRjbnb6ONNmrWXv3qVzdr117bvqfvCSecsKieFmLzzTdv1l71qlc1a7W2Ly65+eabF9UTbbI5GaP+\n3XXDDTc0a6Ny+3d/93dDjx977LHzb4yZWczbwbZOcnopZeU6H6u1fmEiXQGLIZvQTbIJ3SSb0E2y\nCUtg7CFQrfXnSR49wV6ACZBN6CbZhG6STegm2YSl4ZpkAAAAgB4wBAIAAADoAUMgAAAAgB4wBAIA\nAADogcXsDgbZbbfdmrVXvvKVEz/f5z73uYmvCbPW2jo+sUU8rO6AAw5o1u51r3uNteYee+wx9Pi5\n557bfMzFF1/crD34wQ8eqw/ogo033rhZO/LII5u1V7ziFc3aKaec0qxNeov49dZr/477kEMOadYe\n9rCHNWu33XZbs/a1r31tfo3BjLzqVa9q1lasWNGsbbnlls3aEUccMfT4Lrvs0nzMe97znmbtJz/5\nSbPG5LkSCAAAAKAHDIEAAAAAesAQCAAAAKAHDIEAAAAAesAQCAAAAKAHDIEAAAAAesAW8VNw73vf\nu1n7oz/6o2btuuuua9ZuvfXWRfU0Kc961rMmvuZRRx3VrH3961+f+PkAWBrHHHNMs/a85z1vrDXv\ne9/7Nmvrr7/+WGu27LvvvhNdD9YGo7ZKH7UN/ChXX331uO0s2LJly5q1d77znWOteeGFFzZr5557\n7lhrwtps6623Hnr84IMPbj5mzz33bNaWL1/erI36t+GoLe4vueSSZu23v/1ts9YHrgQCAAAA6AFD\nIAAAAIAeMAQCAAAA6AFDIAAAAIAeMAQCAAAA6AFDIAAAAIAesEX8hOy8887N2llnndWstbbXS5KT\nTz65WXvJS14yv8YmYNttt23WDjrooImf7zvf+U6zdscdd0z8fLBQX/nKV5q1K6+8slnbbrvthh4/\n8MADm49505veNP/GoGNe8IIXNGtbbrnlFDsZrbVd/Xnnndd8zIknntisPfGJT2zWHvWoRzVrp5xy\nSrMGk7TJJps0a+NuA3/99dc3a+973/vGWhOYnQsuuKBZu/XWW4cef9zjHtd8zP3vf/+xavvuu2+z\nNspXv/rVZm3//fdv1q699tqxzrc2cSUQAAAAQA8YAgEAAAD0gCEQAAAAQA8YAgEAAAD0gCEQAAAA\nQA8YAgEAAAD0wBq3iC+lHJ/kGUmuqbU+YnBsyySfTLJDkkuT7Fdrbe8LuY7YaKONmrXTTz+9WRu1\nDfwoo7banKYnPelJzdqmm2461prXXXdds/b5z39+rDX7RjZnZ9TWkb///e8XvN797ne/xbRDx8jm\nnX70ox81a6O2UR/XRRdd1KwddNBBzdoPfvCDoceXLVvWfMw973nP+Te2iuc+97nN2hFHHDHWmsyP\nbN7pda97XbP2kpe8ZKw1P/axjzVrF1988VhrjuOFL3zhxNe85JJLJr4md5LNxXvoQx/arL30pS9t\n1ka9bn3lK1/ZrP37v//70OMPfvCDm485+OCDm7UtttiiWTvggAOatVJKs7b77rs3a//0T//UrD3/\n+c9v1tYV87kS6MQke6127PVJzqm1PiTJOYM/A9N1YmQTuujEyCZ00YmRTeiiEyObMDVrHALVWs9N\nsvplG89MctLg65OSPGvCfQFrIJvQTbIJ3SSb0E2yCdM17j2Btq61XjX4+tdJxnu/EzBpsgndJJvQ\nTbIJ3SSbsETWeE+gNam11lJKbdVLKYcmOXSx5wEWRjahm2QTukk2oZtkEyZr3CuBri6lbJMkg8/X\ntL6x1npcrXXXWuuuY54LmD/ZhG6STegm2YRukk1YIuMOgc5I8qLB1y9K8tnJtAMskmxCN8kmdJNs\nQjfJJiyR+WwR//Ekuye5TynliiRvTvKOJJ8qpRyc5LIk+y1lk9O0ySabNGvHH398s3b/+99/rPPd\ncsstzdoxxxwz1pqTtscee0x8zS984QvN2qjnhDv1LZt99fKXv7xZO/bYY6fYCfMlm3d6znOe06yd\ndtppzdqf/dmfjXW+nXbaqVn78Ic/3Ky1toq9/PLLm4959KMfPf/G6ATZvNP2228/8TVPOeWUia85\njm233Xbia3bl77auks3Fe+1rX9us3e9+92vWrr766mbt61//+oL7+MEPftCsvepVr1rwekly9tln\nN2snnHDCWGtutdVWYz1uXbHGIVCt9YBGafKTAWDeZBO6STahm2QTukk2YbrGfTsYAAAAAGsRQyAA\nAACAHjAEAgAAAOgBQyAAAACAHjAEAgAAAOiBNe4O1jejtnrfb7/xdib8xS9+0aztv//+zdpll102\n1vnGseWWWzZrT3ziEyd+vre//e0TXxPWRfe6171m3QKM7be//W2zNmr7+B122KFZ+/SnP92sjfoZ\n/qAHPahZO+aYY4Yev/LKK5uPga7bdNNNm7UHP/jBY625fPnyZu28884ba81J23nnnSe+5hve8IZm\n7eCDD27WvvWtbzVrl19++Vi9fOITnxh6/NZbbx1rPbplvfXa12gcffTRzdqLX/zisc73rne9a6zH\nTdOobezHdccdd0x8zbWJK4EAAAAAesAQCAAAAKAHDIEAAAAAesAQCAAAAKAHDIEAAAAAesAQCAAA\nAKAHSq11eicrZXonG+E+97lPs/bFL36xWXv0ox891vme/exnN2tnnHHGWGuOsmzZsqHHH/awhzUf\n84xnPKNZO+KIIxbd0+qe/vSnN2vf+c53mrXrr79+4r1MU621zLqHYbqSzXXBy172smbt2GOPXfB6\nN9xwQ7O25ZZbLng9hpPNtcdjHvOYZu0d73hHs/aUpzxlKdpZsJ/+9KfN2qif030lm+PbZpttmrVx\ntyf/+c9/3qztvvvuzdqTnvSkZm3U6/KWxz/+8c3a/vvv36xN8989S2W77bYbenwpttEeRTaXxjvf\n+c5m7fDDDx9rzSuuuKJZe8ADHjDWmtP01re+tVl705ve1Kz94Q9/aNae9rSnNWtf/epX59VXV80n\nm64EAgAAAOgBQyAAAACAHjAEAgAAAOgBQyAAAACAHjAEAgAAAOiBDWbdwCzss88+zdq4O4CNssce\nezRr973vfcda8xGPeESz9tSnPnXo8Z122mmscy2FM888s1kbtfPE+9///mbtPe95z6J6gkn49re/\n3az97ne/G3p8s802az5m4403XnRPsC45//zzm7XnP//5zdq+++7brB144IFDjz/ykY9sPmbzzTdv\n1mBdteOOOzZro3a+G/WzbL31uv876dNPP71Zu+iiiyZ+vg9+8IPN2jXXXDPx89EdD3zgA8d63Kgd\nlLv0b8BxjNpVepQf//jHzdravgPYYnX//7oAAAAALJohEAAAAEAPGAIBAAAA9IAhEAAAAEAPGAIB\nAAAA9IAhEAAAAEAPlFrr9E5WyvRONsIZZ5zRrI27BR3TcfvttzdrT3rSk5q17373u0vRzoLVWsus\neximK9lc11111VVDj2+99dbNx9x6663N2lZbbdWstbajZzjZZJgvf/nLzdruu+8+1pqjsnnYYYc1\na5/97Gebtd/85jdj9bI2kM2l8YEPfKBZO/DAA5u1TTfddCnamahRW86vWLGiWTv44IObtRNPPHEx\nLa2TZHNpjHptNyq3Rx99dLP2zW9+c1E9TcN2223XrP3iF79o1tZff/1m7c1vfnOz9ra3vW1+ja2F\n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\nbZZfNc/3AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x111fff590>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(20,4))\n",
    "for index, (image, label) in enumerate(zip(train_img[0:5], train_lbl[0:5])):\n",
    "    plt.subplot(1, 5, index + 1)\n",
    "    plt.imshow(np.reshape(image, (28,28)), cmap=plt.cm.gray)\n",
    "    plt.title('Training: %i\\n' % label, fontsize = 20)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0 187 255  98   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0   0  29 238 253 139\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   5 145 253 253 139   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  66 253 253\n",
      " 253  63   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  19\n",
      "  27   9   0   0   0   0   0 145 253 253 138   3   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0  48 230 253 159   0   0   0   0  26 243\n",
      " 253 253  83   0   0   0   0   0   0   0   0   0   0   0   0   0   0   6\n",
      " 223 253 253 142   0   0   0   0  89 253 253 235  10   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   9 167 253 253 243  31   0   0   0   0\n",
      " 156 253 253 164   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "  39 253 253 220  51   0   0   0   0  18 218 253 253  42   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0  20 206 253 253  78   0   0   0  11\n",
      "  53 128 253 253 253  72  17   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0  94 253 253 253 145  99  99 143 213 253 253 253 253 253 253 219 112\n",
      "   0   0   0   0   0   0   0   0   0   0   0 178 253 253 253 253 253 253\n",
      " 253 253 253 253 253 253 253 253 253 247  54   0   0   0   0   0   0   0\n",
      "   0   0   0  94 253 253 253 253 181 253 179 165 236 253 253 243 165 165\n",
      " 225 209  23   0   0   0   0   0   0   0   0   0   0   6  15  15  15  15\n",
      "   3  15   3   7 209 253 253 167   0   0  10   9   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0  85 253 253 253  45\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   3 204 253 253 246  14   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0   0   6 253 253 253\n",
      " 165   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   6 253 253 253  76   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   6 253\n",
      " 253 244  48   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   4 213 253 128   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0]\n"
     ]
    }
   ],
   "source": [
    "# This is how the computer sees the number 4\n",
    "print(train_img[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Find Number of Principal Components with 95% of Explained Variance"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Train PCA by requesting the projection preserve 95% of the variance. Common to choose number of principal components such that a percentage of the variance is retained (in this case 95%)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "pca = PCA(.95)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PCA(copy=True, iterated_power='auto', n_components=0.95, random_state=None,\n",
       "  svd_solver='auto', tol=0.0, whiten=False)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pca.fit(train_img)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "154"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 95% of the variance amounts to 154 principal components\n",
    "pca.n_components_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The idea with going from 784 components to 154 is to reduce the running time of a supervised learning algorithm (in this case logistic regression) which we will see at the end of the tutorial. One of the cool things about PCA is that we can go from a compressed representation (154 components) back to an approximation of our original high dimensional data (784 components). "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "components = pca.transform(train_img)\n",
    "approximation = pca.inverse_transform(components)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n68aW92jjSvLW+7bbbpsZGzlyZM1lTpgwITM2adKkzFilfV3eZ5bXRbDIdERARESkwJQIiIiIFJgS\nARERkQJTIiAiIlJgSgREREQKTImAiIhIgan7YBOMHj06M3bbbbdlxtZdd93c+V555ZWZsSOOOKJy\nxRpsgw02yIwdeeSRTSnzkUceyYwtWbKkKWVK98l7wmCeZj0lcOzYsZmx448/PjO26aab5s73/vvv\nz4z97Gc/y4zNmDEjM1bpqXx5tt5668zYTjvtVPN833777czYgw8+mBmbO3duzWVqP9B1OiIgIiJS\nYEoERERECkyJgIiISIEpERARESkwJQIiIiIFpkRARESkwCp2HzSzS4G9gVnuPjIOGwj8CRgGdAAH\nuvu7zatm++nbt29mLO+pWpW6COZ59932WsU777xzZmz11Veveb55T1n861//WvN8pf3bc17Xr2Z1\nC/vEJz6RGTvhhBMyY7vttlvNZeZ1I87rIphn9uzZtVaHrbbaKjM2YsSImuebtyy11rd///658bwn\nDNbzJMqerJojApcDe5YNOxG42903A+6O/4tI+7sctWcRSaiYCLj7A0D5T7R9gCvi31cAzXn4vIg0\nlNqziJSr9RqBdd19Zvz7DaD2490i0mpqzyIFVvctht3dzSzz/p5mdjRwdL3liEjz5bVntWWRnqnW\nIwJvmtn6APF9VtaI7n6hu49x9zE1liUizVVVe1ZbFumZak0EbgYOj38fDtzUmOqISAuoPYsUWMVE\nwMyuBv4OjDCz18zsP4AzgN3M7EVg1/i/iLQ5tWcRKVfxGgF3PzgjtEuD69JWVltttdz4pZdemhnb\neOONaypz/vz5ufFzzjmnpvk2yy67NGcTuP322zNjldaR5Ctiex4wYEBu/MADD8yM1XqvgLvuuis3\nfu2119Y037XWWiszVunRvXnrYdttt82M5T3euNK9HSZOnJgZe/bZZ3OnzbLKKvm/X/Pqu3Tp0ppi\nPZ3uLCgiIlJgSgREREQKTImAiIhIgSkREBERKTAlAiIiIgWmREBERKTA6r7FcE9VqQtgXpejPC+/\n/HJm7Ktf/WrutNOnT6+pzHoMHDgwM7bTTjs1pczTTz+9KfOVnqtXr16Zsd133z132kMPPbSmMvO6\nCP7qV7/KnfaRRx6pqcwPPvigpukA1llnnczYyJEja5rnrFmZN5UF8h8bvmDBgprKrNRNMs+qq66a\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x11d32bb10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8,4));\n",
    "\n",
    "# Original Image\n",
    "plt.subplot(1, 2, 1);\n",
    "plt.imshow(train_img[0].reshape(28,28),\n",
    "              cmap = plt.cm.gray, interpolation='nearest',\n",
    "              clim=(0, 255));\n",
    "plt.xlabel('784 components', fontsize = 14)\n",
    "plt.title('Original Image', fontsize = 20);\n",
    "\n",
    "# 154 principal components\n",
    "plt.subplot(1, 2, 2);\n",
    "plt.imshow(approximation[0].reshape(28, 28),\n",
    "              cmap = plt.cm.gray, interpolation='nearest',\n",
    "              clim=(0, 255));\n",
    "plt.xlabel('154 components', fontsize = 14)\n",
    "plt.title('95% of Explained Variance', fontsize = 20);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## Showing Graph of Explained Variance vs Number of Principal Components"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# if n_components is not set all components are kept (784 in this case)\n",
    "pca = PCA()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PCA(copy=True, iterated_power='auto', n_components=None, random_state=None,\n",
       "  svd_solver='auto', tol=0.0, whiten=False)"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pca.fit(train_img)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "784"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pca.n_components_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3432983.6011899523"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Summing explained variance\n",
    "tot = sum(pca.explained_variance_)\n",
    "tot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[9.7767744753228332, 7.1600766394644468, 6.1511802115276266, 5.4000421611869323, 4.8969033531064108]\n"
     ]
    }
   ],
   "source": [
    "var_exp = [(i/tot)*100 for i in sorted(pca.explained_variance_, reverse=True)] \n",
    "print(var_exp[0:5])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3432983.6011899523"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tot = sum(pca.explained_variance_)\n",
    "tot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[9.7767744753228332, 7.1600766394644468, 6.1511802115276266, 5.4000421611869323, 4.8969033531064108]\n"
     ]
    }
   ],
   "source": [
    "var_exp = [(i/tot)*100 for i in sorted(pca.explained_variance_, reverse=True)] \n",
    "print(var_exp[0:5])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Cumulative explained variance\n",
    "cum_var_exp = np.cumsum(var_exp) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Plot can help you understand the level of redundancy present in multiple dimensions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\njzySESNGsHnz5uL+/fv3p3///vztb38rd72df/75/Pvf/y5+X7TMK1qu8+fP5/jjj2fkyJH06tWr\nRIwVzcfatWs5/PDDufzyy+nduzfDhw8nOzsbgO+//55hw4bRv39/Bg4cWLzuH3rooeJlfPfdd5cb\n+4Gq7By0ppWUJdZ0ICIiUv/d+9YyvvupvIMz1derfWPuPqt3heXLli1jwoQJLFiwgJYtW7Jz584q\np/nNN9+wfPlymjdvTrdu3fj1r3/NwoULeeyxx5g8eTKTJoV2IKl169a8//77JCQksHr1ai644AIW\nLVrEAw88wMMPP8zbb78NeIkFQFRUFGeffTavvfYal156KV988QVdunShTZs2XHjhhdxwww0cd9xx\nrF+/nhEjRrB8+fIS9f3jH/+gSZMmfPnll+Tm5nLssccyfPhwzjnnHF555RX+9re/8e6773LvvffS\ntm1bABYuXMjSpUtJSkpi0KBBnHHGGaSlpRVPMyEhgddee43GjRuzfft2jjnmGEaOHFnmPKuvv/6a\nZcuW0b59e4499lg+/fRTjj76aK655hreeOMNWrVqxaxZs7jjjjv45z//yaWXXsoTTzzBCSecwO9/\n//tyl9/YsWN5+eWXOeOMM8jLy2PevHk8+eSTOOfKXa4AX331FUuXLi1zBWVF8wGwevVqXnrpJZ5+\n+mnGjBnDK6+8wsUXX8xFF13ErbfeyjnnnENOTg6BQID33nuP1atXs3DhQpxzjBw5ko8//pgTTjgh\npG0iVJUlaIvM7HLn3NPBPc3s18DiGo1CREQkTD744APOO+88WrZsCUDz5s2rHGfQoEG0a9cOgEMO\nOYThw4cD0LdvXz788MOQ687Pz+d3v/sdS5YsITo6mlWrVlU5ztixY/nTn/7EpZdeysyZMxk7diwA\nc+fO5bvvvisebu/evWRmZpZouXvvvff49ttvi1v29uzZw+rVq+natSuTJ0+mT58+HHPMMVxwwQXF\n45xyyim0aNECgHPPPZdPPvmkRILmnOP222/n448/Jioqik2bNrFly5biBK/IUUcdRceOHQEYMGAA\na9eupWnTpixdupRTTjkF8Fr42rVrx+7du9m9e3dxUjNu3DjeeeedMsvitNNO47rrriM3N5d3332X\nE044gcTERPbs2VPhcj3qqKPKvb1FRfMB0LVrVwYMGADAkUceydq1a8nIyGDTpk2cc845gJfgFS3j\n9957jyOOOALwWuZWr159UBO064HXzOwifk7I0oA44JwajUJERBqEylq6DraYmBgCgQAAgUCAvLy8\n4rL4+Pji7qioqOL3UVFRxec2VTZ+kUcffZQ2bdrwzTffEAgEir/kKzN48GC+//57tm3bxuuvv86d\nd95ZXMfnn39e6TScc0yePJkRI0aUKdu4cSNRUVFs2bKFQCBAVJR3llPplrDS71944QW2bdvG4sWL\niY2NJTU1tdybDgcvs+joaAoKCnDO0bt3bz777LMSwwYfwq1MQkICQ4cO5T//+Q+zZs3i/PPPBypf\nrsnJyeVOq7L5KB170SHO8jjnuO2227jyyitDmofqqvAcNOfcFufcEOBeYK3/utc5N9g5lx7WqERE\nRGrIL37xC/71r3+xY8cOgOJDnKmpqSxe7LU/vPnmm+Tn5+/XdEMZf8+ePbRr146oqChmzJhBYWEh\nACkpKWRkZJQ7XTPjnHPO4cYbb+Twww8vbt0aPnw4kydPLh5uyZIlZcYdMWIETz75ZHEsq1atYt++\nfRQUFHDZZZfx0ksvcfjhh/PII48Uj/P++++zc+dOsrOzef311zn22GPLzEPr1q2JjY3lww8/ZN26\ndSEvo549e7Jt27biBC0/P59ly5bRtGlTmjZtyieffAJ4yVNFxo4dy7PPPst///tfTj311OKYyluu\nldnf+UhJSaFjx468/vrrAOTm5pKVlcWIESP45z//SWZmJgCbNm1i69atVS+M/VTZRQIAOOc+dM5N\n9l8f1HgEIiIiYdS7d2/uuOMOTjzxRPr378+NN94IwOWXX85HH31E//79+eyzzypsealIKONfffXV\nPPfcc/Tv358VK1YUD9OvXz+io6Pp378/jz76aJnxxo4dy/PPP198eBPg8ccfZ9GiRfTr149evXrx\n1FNPlRnv17/+Nb169WLgwIH06dOHK6+8koKCAu6//36OP/54jjvuOB555BGeeeaZ4vPXjjrqKEaN\nGkW/fv0YNWpUicObABdddBGLFi2ib9++TJ8+ncMOOyzkZRQXF8fs2bO55ZZb6N+/PwMGDCg+of/Z\nZ5/lt7/9LQMGDCi+oKA8w4cP56OPPmLYsGHExcVVulwrU535mDFjBo8//jj9+vVjyJAhpKenM3z4\ncC688EIGDx5M3759GT16dIXJ9oGwyhZKbZeWluaKTgoMp2f++wMT/r2cb+8ZTuOE6j9XS0SkIVq+\nfDmHH354pMOQckybNo1FixbxxBNPRDqUeqe87d7MFjvn0ioYpYQqW9BERERE5OCqzsPSRUREpB4Y\nP34848ePj3QYUg61oImIiIjUMkrQRERERGoZJWgiIiIitYwStCoUBhx/nrO86gFFREREaogStCrs\n3JeHc5AcF01KvK6pEBGpix577DH69OlD7969SzxH85577qFDhw4MGDCAAQMGMGfOHAA+/fRT+vXr\nR1paGqtXrwa8u98PHz68+OkBpQ0dOpSePXsWT2v06NHVinXatGn87ne/q3SYN998kwceeKBa0y/t\nnnvu4eGHHy7R76OPPmLw4MEl+hUUFNCmTRt++umnkKddk3E2NMo4QnTr6YeXefyFiIjUfkuXLuXp\np59m4cKFxMXFceqpp3LmmWdy6KGHAnDDDTdw8803lxhn4sSJzJkzh7Vr1/LUU08xceJEJkyYwO23\n3178iKTyvPDCC2Vu9BoOI0eOLH7Qdzgcf/zxbNy4kXXr1tGlSxfAexZo7969ad++fUjTKCgoCHuc\n9Zla0EREpF5bvnw5Rx99NElJScTExHDiiSfy6quvVjpObGwsWVlZZGVlERsby5o1a9iwYQNDhw7d\n7/rPPvtspk+fDsCUKVO46KKLAK/F7brrrmPAgAH06dOHhQsXlhn3rbfe4uijj+aII45g2LBhxQ/3\nDm5lGz9+PNdeey1DhgyhW7duxQ9KB3jooYcYNGgQ/fr14+677y7u/+c//5kePXpw3HHHsXLlyjL1\nRkVFMWbMGGbOnFncb+bMmcUPWX/66acZNGgQ/fv3Z9SoUWRlZRXH8pvf/Iajjz6aP/zhDyXirGhe\n7rnnHi677DKGDh1Kt27dePzxx4vrnD59Ov369aN///6MGzcOgG3btjFq1CgGDRrEoEGD+PTTT/dr\nfdQVakETEZGDqrwkZ8yYMVx99dVkZWVx+umnlykvul/X9u3byxw6nD9/fqX19enThzvuuIMdO3aQ\nmJjInDlzSrRyTZ48menTp5OWlsbEiRNp1qwZt912G5dccgmJiYnMmDGDm2++mQkTJlQ5bxdddBGJ\niYkAnHLKKTz00ENMnTqVY489lq5duzJx4kQ+//zz4uGzsrJYsmQJH3/8MZdddhlLly4tMb3jjjuO\nzz//HDPjmWee4cEHH2TixIll6t28eTOffPIJK1asYOTIkYwePZr33nuP1atXs3DhQpxzjBw5ko8/\n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\n3r2biIgIYmJiOHToEAAVFRUkJiZSW1vbaB0JCQnccMMN7mNNmTLlG7XVc4Lxprz66qssX778Gx3/\nQmlpaaSnp9cr27Fjh/v5aXVqamoICQlpMBtCa7XT29hdnMYYYzq1Tz75hMzMTA4cOEDXrl2ZOnUq\nOTk5zJgxA4CHH36YRx99tN4+GRkZbN26lSNHjvDss8+SkZHB0qVLWbBgAT4+TY9tNDYX55UwYcKE\nJufQvBxuvvlmSkpKOHr0KNdeey3gmgMzLCyMfv36tegYNTU1V7ydnZmNoBljjOn0ampqOHPmDDU1\nNVRXV180yfDz86O6uprq6mr8/Pz46KOP+Pjjj0lISLjkuidOnMi6desAWLVqFdOmTQNcI24PPfQQ\nUVFRhIeHU1BQ0GDfLVu2EBcXR3R0NLfddpt7InTPUbYZM2bw4IMPctNNNzF48GBeeukl9/4rV64k\nNjaWiIgIlixZ4i5ftmwZ119/PSNHjuTgwYMN6vXx8XEnsnVycnLc83GuXr2a2NhYIiMjmTx5snvq\nqxkzZnD//fcTFxfHvHnz6rWzqb6kpaUxc+ZMEhISGDx4MJmZme46161bR0REBJGRkdxzzz0AlJWV\nMXnyZGJjY4mNjWX37t2X9H10GKraYV8jRozQKy3lub/plP/cfcXrMcaYzurAgQP1C0aNavh65hnX\nui++aHz9mjWu9WVlDde1wFNPPaWBgYEaHBysd911l7t8yZIles011+gPfvAD/cUvfqEnT55UVdV9\n+/ZpXFycJiQk6Mcff6zJycn6wQcfNFvHqFGj9Prrr9fIyEiNjIzURx99VFVVP/30U73uuut0586d\nOmTIEC0vL3dv/8tf/lJVVXfs2KFhYWGqqrpmzRqdPXu2qqqePHlSa2trVVV19erVOnfu3AbbTJ8+\nXadMmaLnz5/X9957T6+77jpVVf3LX/6iqampWltbq+fPn9fx48frjh07dO/evRoeHq5ffPGFnjp1\nSq+77jpduXJlg/78/e9/16ioKFVV/fLLL7VPnz7utn/22Wfu7RYuXKiZmZnutowfP15rampa3Jcl\nS5bojTfeqF9++aWWlZVpUFCQnj17VouKinTIkCFaVlamququOyUlRd9++21VVT169Kh+//vfb/Z7\naSsNfu5VFdirLcxx7BSnMcaYTu3zzz/nlVde4fDhw/Ts2ZOkpCTWr1/P3XffzQMPPMDixYsRERYv\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x11d365350>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# PLOT OUT THE EXPLAINED VARIANCES SUPERIMPOSED \n",
    "plt.figure(figsize=(10, 5))\n",
    "plt.step(range(1, 785), cum_var_exp, where='mid',label='cumulative explained variance')\n",
    "plt.title('Cumulative Explained Variance as a Function of the Number of Components')\n",
    "plt.ylabel('Cumulative Explained variance')\n",
    "plt.xlabel('Principal components')\n",
    "plt.axhline(y = 95, color='k', linestyle='--', label = '95% Explained Variance')\n",
    "plt.axhline(y = 90, color='c', linestyle='--', label = '90% Explained Variance')\n",
    "plt.axhline(y = 85, color='r', linestyle='--', label = '85% Explained Variance')\n",
    "plt.legend(loc='best')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Number of Principal Components for 99%, 95%, 90%, and 85% of Explained Variance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Indices corresponding to the first occurrence are returned with the np.argmax function\n",
    "# Adding 1 to the end of value in list as principal components start from 1 and indexes start from 0 (np.argmax)\n",
    "componentsVariance = [784, np.argmax(cum_var_exp > 99) + 1, np.argmax(cum_var_exp > 95) + 1, np.argmax(cum_var_exp > 90) + 1, np.argmax(cum_var_exp >= 85) + 1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[784, 331, 154, 87, 59]"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "componentsVariance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.decomposition import PCA\n",
    "\n",
    "# This is an extremely inefficient function. Will get to why in a later tutorial\n",
    "def explainedVariance(percentage, images): \n",
    "    # percentage should be a decimal from 0 to 1 \n",
    "    pca = PCA(percentage)\n",
    "    pca.fit(images)\n",
    "    components = pca.transform(images)\n",
    "    approxOriginal = pca.inverse_transform(components)\n",
    "    return approxOriginal"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nww8/7NbOO+88t5ZqG/z888+7tbwtOtH9pdrjpmp526z26dPHrW288cZuLdW+PNW2duXKlTWXf/GL\nX3TXOfjgg91aqkX8ueee69ZSpk+f7tbmzp3r1lItvVOtpmkFv37L2/I6tc/MmzfPrc2aNcutDR06\n1K3tvffeHVoupdvq3nzzzW7t73//u1ubM2dOrlrqnBpCcGu0oS6WVF68FtV5z5upjKWe41Q75l69\nerm1VEvslM0337zm8mOPPdZdJ/V698EHH3Rrt9xyi1ubOXNmrtpDDz3k1vIig82XahHv1VLrpJ7D\nhQsXurXU71apc2Pq9e6mm27q1lIGDhxYc/kee+zhrpOqLVq0yK2lfhdN1V566SW3Nn/+fLeW+l10\nyZIlbi2P1HE6df7uLK4EAgAAAAAAKAEmgQAAAAAAAEqASSAAAAAAAIASYBIIAAAAAACgBJgEAgAA\nAAAAKAEmgQAAAAAAAEqAFvHd1NSpU93aihUrai7fc8893XW22mqrXLWjjz7araXceeedbu344493\na6l2fmi+vO2f87Q8TLXFTOnfv79bW7ZsWa5tptp+Tp482a15LUF33nlnd53tttvOrW299dZu7cgj\nj3Rrqcf/tttuc2uf+9zn3NrLL7/s1vK0j0/tW3nb0Tey1WbRpPbRvG2jPanWz6mW0WvWrHFrG2+8\nsVsbNmyYW0u1un366afd2iuvvFJz+ejRo911Uvk744wz3NoXvvAFt5ZqkXvrrbe6tf/6r/9ya6mW\n2KlMePtQ6vlOtT3OewxH5OU2lfVGPOapY/3SpUtz1VKv7bz9N3Uc2G233dzaBz7wAbe2/fbbu7XU\nsXHKlClu7cILL3Rrd999t1tL6ep9oUznxpS8rbq9x3blypXuOsuXL+/w9tqTuj+vnXt79zdjxgy3\ndv/999dcnjoPjBo1yq0NHTrUrR188MFubb/99nNrzz//vFtLvd6966673FqeFvGpfYsW8QAAAAAA\nAGgYJoEAAAAAAABKgEkgAAAAAACAEmASCAAAAAAAoASYBAIAAAAAACgBJoEAAAAAAABKoN0W8WZ2\nuaSPSZobQhidLRsk6VpJIyVNl3RcCOH1xg2ze3v3u9/t1k477TS3lmr1l2o/++ijj9Zcnmo1feqp\np7q1VMvdE0880a2lWt4dcMABbi3V6vZTn/qUWyubZmWzmW3g8+rbt69bS7WBz5uJVKvYVPvnqVOn\n1lyeakt70kknubVUO81PfvKTbi3VRvbQQw91a+ecc45bSx2TUu1CPXnasRZFEbKZt9ajR4+ay1PP\nx+rVq3PVUkaMGOHWjjnmGLeWajv/ta99za098MADNZfvv//+7jo77bRTrtoHP/hBtzZkyBC3dvzx\nx7u15557zq099dRTbm3x4sVuzXvuevb0XzoWvdV0EV7T5s2mx8uslO/Y257UeTPVqjm1r1199dVu\n7cYbb6y5fOutt3bX2WWXXdza4MGD3dqYMWPc2p577unWttpqK7fmvSaXpGnTprm1OXPmuLU8OWtV\nG+p6FSGbKanHyMtZ6rViI17HpH632muvvdza/Pnz3doNN9zg1u64446ayzfeeGN3nW233datpX7f\nTP0unTrupO7Pe00upX93yCO1/7Qqf/VcCTReUvVvBd+SdEcIYXtJd2TfA2iu8SKbQBGNF9kEimi8\nyCZQRONFNoGmaXcSKIRwt6QFVYs/IemK7P9XSDqyi8cFoB1kEygmsgkUE9kEiolsAs2V9zOBBocQ\nZmf/f1WSf20lgGYim0AxkU2gmMgmUExkE2iQdj8TqD0hhGBm7pvZzOx0Sad39n4AdAzZBIqJbALF\nRDaBYiKbQNfKeyXQHDPbUpKyf+d6NwwhjAsh7B5C2D3nfQGoH9kEiolsAsVENoFiIptAg+SdBLpJ\n0snZ/0+WVPuj+wE0G9kEiolsAsVENoFiIptAg9TTIv4Pkg6QtJmZzZD0fUk/lvQ/ZnaqpJckHdfI\nQXZ3Z599tlsbPny4W0u1h7z33ns7PI7HHnvMrZ155pkd3p4k3X777W7tt7/9ba5tbrHFFrnWK5tm\nZbMIrUOldHvTlStXurU+ffq4tR/84AduLbUfptppTpo0ya157atT2fzGN77h1lLPzSmnnOLWfvOb\n37i1VatWubXddtvNreVtRew9r928RXy3zab3fKRa3ebVr18/t3bkkf7nf6ZavqbOjbfddptb8x7L\nW265xV3n5ptvdmsDBw50a0cffbRbO/fcc93a5ptv7tZSLbE32WQTt5Zq2+0pYqvbehXhNW2eNvCp\n9bq65bwkvec973FrY8eOdWsf+tCH3Frq9eKll17q1l5++eWay1Ot1x966CG31r9/f7d2wgknuLVU\ni/gNN9zQraXax2+00UZuLfU7gCd1nM67LzRLEbKZVzOPe/vuu69b+8IXvuDWdthhB7f217/+1a1d\ndtllbm3KlCk1l2+zzTYdXkeSevb0pyWOPfZYt3boodVN5d42YMAAt7bBBv61MEuXLnVr64t2J4FC\nCCc6pY+23P6TAAAgAElEQVR08VgAdADZBIqJbALFRDaBYiKbQHPlfTsYAAAAAAAAuhEmgQAAAAAA\nAEqASSAAAAAAAIASYBIIAAAAAACgBJgEAgAAAAAAKIF2u4PhbalWcueff75bS7VqTvnZz36Wa71m\nytPCsj2NaEWM7iGVsdR+semmm7q1b3/7227tox/9qFtLtZb/6U9/6ta8NvCS1KtXrw6vk7et66xZ\ns9xa6nFO/dxeq14pPc5U+9Q8LeLRvjyPeSOMHj3arZ14otcMRjrzzDNz3d8dd9zh1lIt6VevXl1z\neeq48+abb7q1119/3a29+uqrubaZktrm8uXLc20TjZHKZurY7Ml7/th5553d2te//nW3lmqjnnLj\njTe6tdS5xZPK5iuvvNLh7UnSE0884dZSLaNTbaiXLFni1latWlXfwLoA59TGyfPY9u3b1629733v\nc2up3ylTr2kXLFjg1m644Qa39thjj7k1zwsvvNDhddqz3377dfk2V6xY4dbynou7E64EAgAAAAAA\nKAEmgQAAAAAAAEqASSAAAAAAAIASYBIIAAAAAACgBJgEAgAAAAAAKAEmgQAAAAAAAEqAFvEdcO65\n57q1L3/5y7m2OWPGDLf2i1/8Itc2m2nffffNtd7atWvdWupxxvot1fI1JdXONtVq2mvZLklTp051\na5dcckl9A6vitfLN2149JdVOM2/b63Hjxrm1Hj16uLVU3svQhrMVUvtNV7eP7927t1s7/PDD3do5\n55zT4fuSpPHjx7u1iy66yK0tW7asw/eV2q9TLedTrb732WcftzZ48GC3Nm/ePLd26623urX58+e7\ntRTv+EhmGyeVTe+4nTqep1qX77333m7t2GOPdWspf/7zn93ahAkTcm1z0KBBNZf37On/CjN37txc\n9zV8+HC3lnos58yZ49YeffRRtzZz5sz6BoamyPt6y1svdT7deOON3dro0aPdWur8kTJx4sRctTxS\n2Uy9HkzZcMMNc62XOm++/vrrbi11Ds/7u0rRcCUQAAAAAABACTAJBAAAAAAAUAJMAgEAAAAAAJQA\nk0AAAAAAAAAlwCQQAAAAAABACdAdrAO22WabXOulPn18hx12yDucQkh1fkl54okn3Nqdd96ZczQo\nkjxdhlKdGVIdiIYOHerWUh3AnnrqKbd2yCGHuLVVq1a5tVRHAa+rTt6OFCmpbKY6Hj322GNu7bbb\nbuvUmDqiER3TyiTvY5Tafz2prh2pDigpjz/+uFv71a9+5dbydgXy9rdUVpYvX+7WUserHXfcsf6B\nVbj//vvd2kMPPZRrmynez053sM5JZTP12ObJdN++fd3a5ptv7tYWLFjg1iZNmuTWUtmcNm2aW0vx\nHpM83f4kadttt3Vrhx56aK5tPvLII27tnnvucWtkqfvIk7/U+TTVXTLViW7RokVubfLkyW7tL3/5\ni1t76aWX3FrKqFGjai5PPVYvvPCCW0sdr97//vfXP7AKqc5nzz33nFtbXzqApXAlEAAAAAAAQAkw\nCQQAAAAAAFACTAIBAAAAAACUAJNAAAAAAAAAJcAkEAAAAAAAQAkwCQQAAAAAAFACtIjvgDPOOMOt\npdoAnn/++W5txYoVnRpTMwwbNsyt7bTTTrm2ed111+UdDtYDXjvmVFvJ1atXu7Vf/vKXbi3Vzj3V\n8nz27NlurU+fPrnur6ttueWWbm3nnXd2a2vXrnVrN998c66xpFq6p46PXotcWsS3hvdcpZ6PxYsX\nu7UJEya4tVQL1lTL84cfftitpaRy640lddxJ2XPPPd3aHnvskWub9913n1ubP39+rm326tXLrXmP\nCW2tG6erj21r1qxxa88++6xbGz9+vFtLtUO/++676xpXRyxcuLBLt7fjjju6tdR5M+WBBx5wazNm\nzMi1TXR/PXr0cGup89/MmTPd2t/+9je3NmfOHLf2hz/8wa3l/V3Uey25cuXKXNs7+OCD3dqHP/zh\nXNtMnTeffPLJXNtMvR7yzqmp192tOqe2eyWQmV1uZnPN7PGKZWPNbKaZTc6+DmvsMAFUI5tAMZFN\noJjIJlBMZBNornreDjZe0qE1lv8ihDAm+7qla4cFoA7jRTaBIhovsgkU0XiRTaCIxotsAk3T7iRQ\nCOFuSQuaMBYAHUA2gWIim0AxkU2gmMgm0Fyd+WDoL5vZlOzyvU29G5nZ6Wb2sJnlexM/gI4im0Ax\nkU2gmMgmUExkE2iAvJNAF0vaVtIYSbMlnefdMIQwLoSwewhh95z3BaB+ZBMoJrIJFBPZBIqJbAIN\nkmsSKIQwJ4TwRgjhTUmXSvLbYABoGrIJFBPZBIqJbALFRDaBxsnVIt7MtgwhtPVPPkrS46nbry/m\nzp3r1o455pgmjqS5jjvuOLeWan+4fPlyt9aINqIoVjZTrW69Wt52mlOmTHFr3/rWt9xaqrV17969\n3Voz28CnnHDCCW4t1ZY91Tb4llv8z13M+/ykap71rQ18kbKZ4rU+TbVETbU3vfPOO91aqj1rqtVt\nSs+e/suaPLlN/dz9+vVza6NHj3Zrw4cPd2uprDz44INuLdXKPnUsK2Lb2mbrLtnMY9GiRW7tnnvu\ncWsPPfSQW5s/f36usfTt29etpbLptVxO7Z+p/TqVhz59+ri1119/3a2lHq+8UseX1Ovr9Ul3yWbq\nPOFZuHChW0u9pp09e7ZbmzVrVq77y2vJkiU1ly9YkO+jnUaNGuXWBg0a5NZSrxceeeQRt+aNvz2p\n5zv12rto2p0EMrM/SDpA0mZmNkPS9yUdYGZjJAVJ0yV9roFjBFAD2QSKiWwCxUQ2gWIim0BztTsJ\nFEI4scbi3zRgLAA6gGwCxUQ2gWIim0AxkU2gubrPNUsAAAAAAADIjUkgAAAAAACAEmASCAAAAAAA\noASYBAIAAAAAACiBXC3igXq89tprbo0W8agl1R451bo11U481QY+JdVGPSVvG3VPqt1kqkVuqoXl\nzJkz3drUqVPdWp7x55Ua//rWPr7ZUo9fVz/HqfvK2wbeaxndXi1P2+hU6/Vly5a5tVQb31RuJ02a\nlKuW0rOn/1Iv9fN58rRDlsht0aT20bxS5+nUuTG1j/bv37/m8lTL9pQhQ4Z0+L4k6a677nJrqfNm\n3rGkjldlaRFfJKnjXmr/9aTaky9dutStpdqvr1q1qsPjaM8WW2zh1rr69cJmm23m1lLnzSlTpri1\nZ599tlNjqiXvObBouBIIAAAAAACgBJgEAgAAAAAAKAEmgQAAAAAAAEqASSAAAAAAAIASYBIIAAAA\nAACgBJgEAgAAAAAAKAFaxKNdEydOdGupln2/+tWvGjEclFQjWl+m2nqm2rOm2ranWmZ666VaJ6cy\nNnny5FzjuOSSS9zaihUr3Fre9tupx3nNmjU1l9MivnFS+5TXMjz1fKTykKql9pm8mtk6ecCAAW5t\n++23d2up1sC33nprrvVSuvpxTrUBT91XI57v9U13P+6lztN5z+GpdtmeTTbZxK3ts88+bq13795u\n7b777nNrM2fOrG9gVVLP98qVK3NtE42Req569OhRc3nqXJuSynoqD6ljc79+/dzawIED3dpGG23k\n1l555RW35hkxYoRbGzp0qFt78cUX3dqkSZPc2rx58+obWAekXtN68u4LjcSVQAAAAAAAACXAJBAA\nAAAAAEAJMAkEAAAAAABQAkwCAQAAAAAAlACTQAAAAAAAACXAJBAAAAAAAEAJ0CIekqRx48a5tc98\n5jNuLdVO+rzzzuvUmLD+8torploopmqpNtSptp7Nblmcp0Xk5Zdf7tZOPPFEt+a1+pakCy64oMPj\nkPx27o1Yr4jtNMss1bI21S417/PYq1cvt5Z3P0xt08tL37593XU++9nPurXvf//7bm3+/Plu7aab\nbnJrKalx5m017W0z9Ti+8cYbue4LUSpnXhvq1Dkulc3UeqnnMXVuSUndX+oc7uU9tc4RRxzh1j78\n4Q+7teeff96t/f3vf3dreS1atMitLV++vMvvD/ml9l/vmJg6/+XNUep1ayoTqfbxqbzPnDnTrXm/\nAw4YMMBd58gjj3Rro0aNcmvTpk1za48++qhbW7JkiVvLq3fv3m4t7+uTVuBKIAAAAAAAgBJgEggA\nAAAAAKAEmAQCAAAAAAAoASaBAAAAAAAASoBJIAAAAAAAgBJgEggAAAAAAKAE2m0Rb2YjJF0pabCk\nIGlcCOGXZjZI0rWSRkqaLum4EMLrjRsqGmnfffd1a6mWg3/605/cGi2eG6s7Z9NrR5lqj5vaDxux\nr3nteKV0O82uHufuu+/u1lJtoX/961+7tVQLy1Qb0VWrVrm1VCviVEvT9VF3zmYeqf06b8vwVDve\nlFRuU/uol4khQ4a465x00kluLdUi9/zzz3drkyZNcmspqZ+tq6XyXPTzftGzmaeNemqfT20vdb5N\nrdevXz+3ljp/pLa5YMECt+bZZ5993NqnP/1pt5Ya4zXXXOPW8mYzhTbwbytCNvPkL7VeqpV4qkV8\nI9qMr1y50q11dRv1Aw880K198pOfdGsDBw50a3fddZdbmzx5slvLe05KHedS+0nRz4GV6rkSaK2k\nb4QQ3itpb0lfMrP3SvqWpDtCCNtLuiP7HkDzkE2gmMgmUExkEygmsgk0UbuTQCGE2SGER7L/L5H0\nlKRhkj4h6YrsZldIOrJRgwSwLrIJFBPZBIqJbALFRDaB5urQ9cNmNlLSrpIelDQ4hDA7K72qePle\nrXVOl3R6/iECaA/ZBIqJbALFRDaBYiKbQOPV/cHQZjZA0p8lfTWEsLiyFuIbi2u+uTiEMC6EsHsI\n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\n3I3OjAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x11d01ac50>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(20,4));\n",
    "\n",
    "# Original Image (784 components)\n",
    "plt.subplot(1, 5, 1);\n",
    "plt.imshow(train_img[4].reshape(28,28),\n",
    "              cmap = plt.cm.gray, interpolation='nearest',\n",
    "              clim=(0, 255));\n",
    "plt.xlabel('784 Components', fontsize = 12)\n",
    "plt.title('Original Image', fontsize = 14);\n",
    "\n",
    "# 331 principal components\n",
    "plt.subplot(1, 5, 2);\n",
    "plt.imshow(explainedVariance(.99, train_img)[4].reshape(28, 28),\n",
    "              cmap = plt.cm.gray, interpolation='nearest',\n",
    "              clim=(0, 255));\n",
    "plt.xlabel('331 Components', fontsize = 12)\n",
    "plt.title('99% of Explained Variance', fontsize = 14);\n",
    "\n",
    "# 154 principal components\n",
    "plt.subplot(1, 5, 3);\n",
    "plt.imshow(explainedVariance(.95, train_img)[4].reshape(28, 28),\n",
    "              cmap = plt.cm.gray, interpolation='nearest',\n",
    "              clim=(0, 255));\n",
    "plt.xlabel('154 Components', fontsize = 12)\n",
    "plt.title('95% of Explained Variance', fontsize = 14);\n",
    "\n",
    "# 87 principal components\n",
    "plt.subplot(1, 5, 4);\n",
    "plt.imshow(explainedVariance(.90, train_img)[4].reshape(28, 28),\n",
    "              cmap = plt.cm.gray, interpolation='nearest',\n",
    "              clim=(0, 255));\n",
    "plt.xlabel('87 Components', fontsize = 12)\n",
    "plt.title('90% of Explained Variance', fontsize = 14);\n",
    "\n",
    "# 59 principal components\n",
    "plt.subplot(1, 5, 5);\n",
    "plt.imshow(explainedVariance(.85, train_img)[4].reshape(28, 28),\n",
    "              cmap = plt.cm.gray, interpolation='nearest',\n",
    "              clim=(0, 255));\n",
    "plt.xlabel('59 Components', fontsize = 12)\n",
    "plt.title('85% of Explained Variance', fontsize = 14);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## PCA to Speed up Machine Learning Algorithms (Logistic Regression)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Mention how long it takes for me to run classification with 99, 95, 90, 85 (maybe make a table). Go that PCA is not necessary in every data science workflow\n",
    "\n",
    "\n",
    "Need to put the steps for applying PCA for machine learning applications\n",
    "1. Fit PCA on training set. <b>Note: we are fitting PCA on the training set only</b>\n",
    "2. Apply the mapping (transform) to both the training set and the test set. \n",
    "3. Train your machine learning algorithm (in this case logistic regression) on the transformed training set\n",
    "4. Test your machine learning algorithm on the transformed test set.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[Logistic Regression Sklearn Documentation](http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) <br>\n",
    "One thing I like to mention is the importance of parameter tuning. While it may not have mattered much for the toy digits dataset, it can make a major difference on larger and more complex datasets you have. <b>Please see the parameter: solver (if you think the algorithm is too slow)</b>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<b>Step 1: </b> Import the model you want to use"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In sklearn, all machine learning models are implemented as Python classes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LogisticRegression "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<b>Step 2:</b> Make an instance of the Model"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<b>time it on my computer with and without PCA for viewers benefit</b>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# all parameters not specified are set to their defaults\n",
    "# default solver is incredibly slow thats why we change it\n",
    "# solver = 'lbfgs'\n",
    "logisticRegr = LogisticRegression()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<b>Step 3:</b> Training the model on the data, storing the information learned from the data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Model is learning the relationship between x (digits) and y (labels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False)"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "logisticRegr.fit(train_img_PCA, train_lbl)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<b>Step 4:</b> Predict the labels of new data (new images)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Uses the information the model learned during the model training process"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([7], dtype=uint8)"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Returns a NumPy Array\n",
    "# Predict for One Observation (image)\n",
    "logisticRegr.predict(test_img_PCA[0].reshape(1,-1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([7, 2, 1, 0, 4, 1, 4, 9, 6, 9], dtype=uint8)"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Predict for Multiple Observations (images) at Once\n",
    "logisticRegr.predict(test_img_PCA[0:10])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Measuring Model Performance"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "accuracy (fraction of correct predictions): correct predictions / total number of data points"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Basically, how the model performs on new data (test set)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(maybe look into F1 score with this just to change it up a bit, dont want viewers to think accuracy is only useful metric)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9088\n"
     ]
    }
   ],
   "source": [
    "score = logisticRegr.score(test_img_PCA, test_lbl)\n",
    "print(score)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "http://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html or F1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python [conda root]",
   "language": "python",
   "name": "conda-root-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
